const electron = require('electron');
const app = electron.app;
const ipcMain = electron.ipcMain;
const dialog = electron.dialog;
const { BrowserWindow, Menu, Tray } = electron;

const path = require('path');
const { menu: myMenuDesc, trayMenu: myTrayMenuDesc, contextMenu: myContextMenuDesc } = require('./menu.js');

// 保持对window对象的全局引用，如果不这么做的话，当JavaScript对象被
// 垃圾回收的时候，window对象将会自动的关闭
let mainWindow = null;

let menu = null;
let contextMenu = null;
let appTray = null;

function createMainWindow() {
    // 创建浏览器窗口。
    mainWindow = new BrowserWindow({
        width: 1000,
        height: 800,
        webPreferences: {
            nodeIntegration: true
        }
    });
    app.mainWindow = mainWindow;
    mainWindow.loadFile('index.html');
    //mainWindow.webContents.openDevTools();
    mainWindow.on('show', () => {
        console.log(mainWindow + ' ---- show');
    });
    mainWindow.on('hide', () => {
        console.log(mainWindow + ' ---- hide');
    });
    // 点击close
    mainWindow.on('close', (event) => {
        mainWindow.hide();
        event.preventDefault();// 禁止关闭行为(非常必要，因为我们并不是想要关闭窗口，所以需要禁止默认行为)
    });
    // 当 window 被关闭，这个事件会被触发。
    mainWindow.on('closed', () => {
        console.log(mainWindow + ' ---- closed');
        // 取消引用 window 对象，如果你的应用支持多窗口的话，
        // 通常会把多个 window 对象存放在一个数组里面，
        // 与此同时，你应该删除相应的元素。       
        mainWindow = null;
    });
    // 此win的上下文菜单
    contextMenu = Menu.buildFromTemplate(myContextMenuDesc);
    mainWindow.webContents.on('context-menu', function (e, params) {
        contextMenu.popup(mainWindow, params.x, params.y);
    });

    // 应用程序菜单
    menu = Menu.buildFromTemplate(myMenuDesc);
    Menu.setApplicationMenu(menu);

    // 应用程序托盘菜单
    let trayIcon = path.join(__dirname, 'res/tray');
    appTray = new Tray(path.join(trayIcon, 'app.ico'));
    appTray.setToolTip('This is my application.');
    appTray.setContextMenu(Menu.buildFromTemplate(myTrayMenuDesc));
    // 任务栏点击事件
    appTray.on('double-click', function () {
        app.showWindow();
    })
}

// Electron 会在初始化后并准备
// 创建浏览器窗口时，调用这个函数。
// 部分 API 在 ready 事件触发后才能使用。
app.on('ready', () => {
    console.log('app - ready');
    createMainWindow();
});

// 当全部窗口关闭时退出。
app.on('window-all-closed', () => {
    // 在 macOS 上，除非用户用 Cmd + Q 确定地退出，
    // 否则绝大部分应用及其菜单栏会保持激活。
    if (process.platform !== 'darwin') {
        console.log('app - window-all-closed');
        closeSrvs();
        app.quit();
    }
});

app.on('activate', () => {
    // 在macOS上，当单击dock图标并且没有其他窗口打开时，
    // 通常在应用程序中重新创建一个窗口。
    if (mainWindow === null) {
        console.log('app - activate');
        createMainWindow();
    }
});

// 追加方法
app.showWindow = () => {
    // 托盘
    if (appTray) {
        appTray.setHighlightMode('always');
    }
    // 最小化->show
    if (mainWindow && mainWindow.isMinimized()) {
        console.log('app mainWindow min->show');
        mainWindow.show();
        return;
    }
    // show
    if (mainWindow && !mainWindow.isVisible()) {
        mainWindow.show();
    }
};
app.hideWindow = () => {
    // 托盘
    if (appTray) {
        appTray.setHighlightMode('never');
    }
    // hide
    if (mainWindow && mainWindow.isVisible()) {
        mainWindow.hide();
    }
};
app.forceExit = () => {
    closeSrvs();
    app.exit();
};

// 打开文件夹
ipcMain.on('open-directory-dialog', function (event, arg) {
    // 'openFile', 'openDirectory', 'multiSelections'
    dialog.showOpenDialog(mainWindow, {
        properties: [arg]
    }, function (files) {
        event.sender.send('open-directory-dialog-ok', files);
    });
});

// 开启web静态服务器
let webStaticHttp = null;
ipcMain.on('begin-web-static', (event, arg) => {
    console.log("electron begin-web-static ", arg);
    let newOne = () => {
        try {
            let obj = JSON.parse(arg);
            if (obj && obj.root) {
                const createWebStaticSrv = require('./srv-web-static/srv.js');
                createWebStaticSrv(obj, (b, s, str) => {
                    if (b) {
                        webStaticHttp = s;
                        event.reply('begin-web-static-ok', `create web-static-srv ok ${str}`, true);
                    } else {
                        event.reply('begin-web-static-ok', "create web-static-srv fail", false);
                    }
                });
            } else {
                event.reply('begin-web-static-ok', "parse json fail", false);
            }
        } catch (error) {
            console.log(error);
            event.reply('begin-web-static-ok', "parse json fail", false);
        }
    }
    if (webStaticHttp) {
        webStaticHttp.close((error) => {
            if (error) {
                console.log(error);
                event.reply('begin-web-static-ok', "close current web-static-srv error", false);
            } else {
                newOne();
            }
        });
    } else {
        newOne();
    }
});

// 连接ftp服务器
let ftpClient = null;
ipcMain.on('begin-ftpc', (event, arg) => {
    console.log("electron begin-ftpc ", arg);
    let newOne = () => {
        try {
            let obj = JSON.parse(arg);
            if (obj && obj.host) {
                const createFtpClient = require('./srv-ftp/ftpc.js');
                ftpClient = createFtpClient(obj, (b) => {
                    if (b) {
                        event.reply('begin-ftpc-ok', "create ftp client ok", true);
                        ftpClient.showList("/", (files) => {
                            if (files) {
                                event.reply('ftpc-list-ok', '/', files);
                            }
                        });
                    } else {
                        event.reply('begin-ftpc-ok', "create ftp client fail", false);
                    }
                });
                if (!ftpClient) {
                    event.reply('begin-ftpc-ok', "create ftp client fail", false);
                }
            } else {
                event.reply('begin-ftpc-ok', "parse json fail", false);
            }
        } catch (error) {
            console.log(error);
            event.reply('begin-ftpc-ok', "parse json fail", false);
        }
    };
    if (ftpClient) {
        ftpClient.destroy();
        newOne();
    } else {
        newOne();
    }
});


function closeSrvs() {
    if (webStaticHttp) {
        webStaticHttp.close();
        webStaticHttp = null;
    }
    if (ftpClient) {
        ftpClient.destroy();
        ftpClient = null;
    }
}